package quatrecentvingtetun;

import static quatrecentvingtetun.Lire.jString;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * Created by IntelliJ IDEA.
 * User: sylvain
 * Date: 2 avr. 2009
 * Time: 14:52:29
 * To change this template use File | Settings | File Templates.
 */
public class Decharge {
    private ArrayList<Joueur> j;

    Decharge(ArrayList<Joueur> j){
        this.j = j;
    }

    public void Start(){
            while(evalFin()==false){
               //début de la décharge
                int k = 0;
                //tour de chaque joueur
                for (int i=0;i<j.size();i++){
                    System.out.println(j.get(i).getNom()+" lance les dés.");
                    j.get(i).lancer(); //lancer() lance trois dés , les tri en appellant la méthodes de joueur TriEntier(),
                    k++; //Premier lancé ok
                     // et  stock la figure obtenu dans l'attribut correspondant
                    System.out.println(j.get(i).getNom()+ " obtient: "+j.get(i).getFigure());

                     // demande de relançage de dés
                    System.out.println("Relancer les dés? (o/n)");
                    String test_relance= jString();
                    // vérif
                    while(k<3){
                        while(test_relance!="o" || test_relance!="n"){
                               System.out.println("Relancer les dés? (o/n)");
                                test_relance= jString();
                         }

                        //traitement si oui
                         if(test_relance=="0"){
                             relance(j.get(i), k);           // permet d'effectuer jusqu'à deux relance avec ou sans blocage
                         }else{break;}
                        k+=1;
                    }
                    System.out.println(j.get(i).getNom()+ " a validé la figure: "+j.get(i).getFigure());
                    //calcul du score pour le joueur courant
                    j.get(i).getFigure().CalculScore();
                    System.out.println("Score:"+j.get(i).getFigure().getScore());
                }
                //Evaluation vainqueur du tour  après éventuelle rampo , du perdant après éventuelle rampo puis distrib des jetons
                while(EvalPerdant() == -1){
                    //On est sûr d'avoir une égalité, on refait un tour en un jet dans le sens inverse
                    System.out.println("Rampo pour le perdant!");
                    for (int i=j.size();i>0;i--){
                        System.out.println(j.get(i).getNom()+" lance les dés.");
                        j.get(i).lancer(); //lancer() lance trois dés , les tri en appellant la méthodes de joueur TriEntier()
                         // et  stock la figure obtenu dans l'attribut correspondant
                        System.out.println(j.get(i).getNom()+ " obtient: "+j.get(i).getFigure());

                        j.get(i).getFigure().CalculScore();
                        System.out.println("Score:"+j.get(i).getFigure().getScore());
                     }
                    
                }
                while(EvalVainqueur() == -1){
                    //On est sûr d'avoir une égalité, on refait un tour en un jet dans le sens inverse
                    System.out.println("Rampo pour le gagnant!");
                    for (int i=j.size();i>0;i--){
                        System.out.println(j.get(i).getNom()+" lance les dés.");
                        j.get(i).lancer(); //lancer() lance trois dés , les tri en appellant la méthodes de joueur TriEntier()
                         // et  stock la figure obtenu dans l'attribut correspondant
                        System.out.println(j.get(i).getNom()+ " obtient: "+j.get(i).getFigure());

                        j.get(i).getFigure().CalculScore();
                        System.out.println("Score:"+j.get(i).getFigure().getScore());
                     }

                }
                j.get(EvalVainqueur()).donneJetons(j.get(EvalPerdant()));
           }
    }

    public Boolean evalFin(){
            Iterator<Joueur> it = j.iterator();
            boolean fin=false;

            while(it.hasNext() && fin==false){
                if(it.next().getJetons()==25){

                    fin=true;
                }
            }
            return fin;
    }

    public void relance(Joueur j, int k){
        String s = "";
        System.out.println("Vous avez fait précédement: "+j.getFigure()+ "Il vous reste "+k+" lancé(s)");
        System.out.println("Saisissez 3 charactères, puis entrer pour indiquer les dés que vous réservez");
        System.out.println("Par exemple: \"XOX\" réservera le premier et le dernier dé (X -> réserve, O -> laisse)");
        s = jString();
        while(s.length() != 3){
            System.out.println("veuillez saisir 3 caractères");
            s= jString();
        }
        j.lancerDecharge(j.getFigure(), s);
    }

        public int getMaxNiveau(){
            Joueur jou;
            int maxi =j.get(0).getFigure().getNiveau();
            int indice=0;
            int nb = 0;
            Iterator<Joueur> it = j.iterator();
             Iterator<Joueur> itbis = it;
            while(it.hasNext()){
                 jou=it.next();
                if (jou.getFigure().getNiveau() > maxi){
                   maxi =jou.getFigure().getNiveau();
                  indice=j.indexOf(jou);
               }
            }

            while(itbis.hasNext()){
                 jou=it.next();
                if (jou.getFigure( ).getNiveau() == maxi){
                    nb++;
               }
            }
             return (nb == 1?indice:-1);

        }

        public int getMaxScore(){
            Joueur jou;
            int maxi =j.get(0).getFigure().getScore();
            int indice=0;
            int nb = 0;
            Iterator<Joueur> it = j.iterator();
             Iterator<Joueur> itbis = it;
            while(it.hasNext()){
                 jou=it.next();
                if (jou.getFigure().getScore() >= maxi){
                   maxi=jou.getFigure().getScore();
                  indice=j.indexOf(jou);
               }
            }

            while(itbis.hasNext()){
                 jou=it.next();
                if (jou.getFigure( ).getScore() == maxi){
                    nb++;
               }
            }
             return (nb == 1?indice:-1);
        }

        public int getMinJet(){
            Joueur jou;
            int mini =j.get(0).getNbRelance();
            int indice=0;
            int nb = 0;
            Iterator<Joueur> it = j.iterator();
             Iterator<Joueur> itbis = it;
            while(it.hasNext()){
                 jou=it.next();
                if (jou.getNbRelance() <= mini){
                   mini=jou.getNbRelance();
                  indice=j.indexOf(jou);
               }
            }
            return (nb == 1?indice:-1);
        }

        public int getMinNiveau(){
            Joueur jou;
            int mini =j.get(0).getFigure().getNiveau();
            int indice=0;
            int nb = 0;
            Iterator<Joueur> it = j.iterator();
             Iterator<Joueur> itbis = it;
            while(it.hasNext()){
                 jou=it.next();
                if (jou.getFigure().getNiveau() <= mini){
                   mini=jou.getFigure().getNiveau();
                  indice=j.indexOf(jou);
               }
            }

            while(itbis.hasNext()){
                 jou=it.next();
                if (jou.getFigure( ).getNiveau() == mini){
                    nb++;
               }
            }
             return (nb == 1?indice:-1);

        }

        public int getMinScore(){
            Joueur jou;
            int mini =j.get(0).getFigure().getScore();
            int indice=0;
            int nb = 0;
            Iterator<Joueur> it = j.iterator();
             Iterator<Joueur> itbis = it;
            while(it.hasNext()){
                 jou=it.next();
                if (jou.getFigure().getScore() <= mini){
                   mini=jou.getFigure().getScore();
                  indice=j.indexOf(jou);
               }
            }

            while(itbis.hasNext()){
                 jou=it.next();
                if (jou.getFigure( ).getScore() == mini){
                    nb++;
               }
            }
             return (nb == 1?indice:-1);
        }

        public int getMaxJet(){
            Joueur jou;
            int maxi =j.get(0).getNbRelance();
            int indice=0;
            int nb = 0;
            Iterator<Joueur> it = j.iterator();
             Iterator<Joueur> itbis = it;
            while(it.hasNext()){
                 jou=it.next();
                if (jou.getNbRelance() >= maxi){
                   maxi=jou.getNbRelance();
                  indice=j.indexOf(jou);
               }
            }

            while(itbis.hasNext()){
                 jou=it.next();
                if (jou.getNbRelance() == maxi){
                    nb++;
               }
            }
             return (nb == 1?indice:-1);
        }

        public int getFigMinOpposition(){
            Joueur jou;
            int mindemax =j.get(0).getFigure().getDeMax();
            int indice=0;
            int nb = 0;
            Iterator<Joueur> it = j.iterator();
             Iterator<Joueur> itbis = it;
            while(it.hasNext()){
                 jou=it.next();
                if (jou.getFigure().getDeMax() < mindemax){
                   mindemax=jou.getFigure().getDeMax();
                  indice=j.indexOf(jou);

               }
            }
            while(itbis.hasNext()){
                 jou=it.next();
                if (jou.getFigure().getDeMax() == mindemax){
                    nb++;
               }
            }
            return (nb == 1?indice:-1);
        }


        public int EvalPerdant(){
            int indNiv = getMaxNiveau();
            int indScor = getMinScore();
            int indJet = getMaxJet();
            int indFig = getFigMinOpposition();

            System.out.println("Niveau: "+indNiv+", Score: "+indScor+", Jet: "+indJet+", Fig: "+indFig);

            if(indNiv != -1)
                return indNiv;          
            if(indScor != -1)
                return indScor;
            if(indFig != -1)
                return indScor;              
            //On a peur-être une égalité de figure?

            if(indJet != -1)
                return indJet;

            return -1;
    }

     public int EvalVainqueur(){
           int indNiv = getMinNiveau();
            int indScor = getMaxScore();
            int indJet = getMinJet();

            System.out.println(indNiv);

            if(indNiv != -1)
                return indNiv;
            if(indScor != -1)
                return indScor;
            if(indJet != -1)
                return indJet;

            return -1;
     }
}


